=begin

This file is part of the RSIF project, http://rsif.googlecode.com

Copyright (c) 2009-2009 Roberto Dario Seminara <robertodarioseminara@gmail.com>

rsif is free software: you can redistribute it and/or modify
it under the terms of the gnu general public license as published by
the free software foundation, either version 3 of the license, or
(at your option) any later version.

rsif is distributed in the hope that it will be useful,
but without any warranty; without even the implied warranty of
merchantability or fitness for a particular purpose.  see the
gnu general public license for more details.

you should have received a copy of the gnu general public license
along with rsif.  if not, see <http://www.gnu.org/licenses/>.
=end

module Rsif
module Core
module Classes

module RoleClass

  # el modulo se SubclassesRegister provee todo lo necesario
  # para poder registrar subclasses, incluyendo el metodo especial
  # inherited
  module SubclassesRegister

     attr_reader :subclasses
     attr_writer :subclasses

     def inherited( klass )
      self.subclasses = self.subclasses + [klass]
      redefine( klass )
     end

     def redefine( klass )
	def klass.inherited(clas)
		self.superclass.inherited(clas)
	end
	def klass.create
	  self.new
	end
     end
  end

  # el metodo especial de clase included permite hacer algo con la clase
  # que incluya este modulo como mixin, recibe la clase en cuestion
  def self.included( klass )
    # cada vez que una clase incluya este modulo, hay que asegurarse
    # que que la clase (el objeto) incluya el modulo, ojo, no es lo mismo que la clase
    # incluya el modulo, ya que lo que se esta haciendo es incluirlo en la clase como objeto
    # haciendo que los metodos del modulo se incluyan como metodos de clase
    unless klass.include? SubclassesRegister
      klass.extend SubclassesRegister

      # inicializar el array de subclasses en esa clase
      klass.subclasses = []
    end
  end
end

end
end
end

